{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CastDtypeInputRealize\n",
    "\n",
    "参考：`tvm/src/relay/quantize/realize.cc`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```cpp\n",
    "/* \\brief for unary operators which requantize its input to dtype_nbit */\n",
    "Expr CastDtypeInputRealize(const Call& ref_call, const Array<Expr>& new_args,\n",
    "                           const ObjectRef& ctx) {\n",
    "  const QConfig& cfg = QConfig::Current();\n",
    "  ICHECK_EQ(new_args.size(), 1);\n",
    "  if (const auto* n = new_args[0].as<QRealizeIntExprNode>()) {\n",
    "    Expr data = Cast(n->data, cfg->dtype_input);\n",
    "    Expr ret = ForwardOp(ref_call, {data});\n",
    "    return QRealizeIntExpr(ret, n->dom_scale, cfg->dtype_input);\n",
    "  }\n",
    "  ICHECK(!new_args[0]->IsInstance<TempExprNode>());\n",
    "  return Expr(nullptr);\n",
    "}\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这段代码定义了一个名为 `CastDtypeInputRealize` 的函数，它接受三个参数：`ref_call`、`new_args` 和 `ctx`。该函数的作用是将一元算子的输入重新量化为 `dtype_nbit` 类型。\n",
    "\n",
    "首先，获取当前的 `QConfig` 对象 `cfg`。然后检查 `new_args` 数组的大小是否为 `1`。如果 `new_args[0]` 是 `QRealizeIntExprNode` 类型的实例，那么将 `n->data` 转换为 `cfg->dtype_input` 类型，并将结果存储在 `data` 中。接着，使用 `ForwardOp` 函数将 `ref_call` 和 `{data}` 作为参数传递，并将结果存储在 `ret` 中。最后，返回 `QRealizeIntExpr` 对象，其中包含 `ret`、`n->dom_scale` 和 `cfg->dtype_input`。\n",
    "\n",
    "如果 `new_args[0]` 不是 `TempExprNode` 类型的实例，那么返回空的 `Expr` 对象。"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
